Este guia presume que estamos usando o Raspian com um Raspberry Pi 3.

[[!toc levels=6]]

---

# O que é isto?

## Raspberry Pi

[Raspberry Pi](https://www.raspberrypi.org>) é um computador de baixo custo e baixo consumo de energia, simples e eficiente.

## cgminer

[cgminer](http://ck.kolivas.org/apps/cgminer/) é um software de mineração de criptomoedas.

## criptomoeda

[[!wikipedia pt:Criptomoeda desc="Página na Wikipedia"]]

## mineração

[FAQ Bitcoin](https://bitcoin.org/pt_BR/faq#mineracao)

---

# Tutorial

Considerando que o sistema operacional é o [Raspian](https://www.raspberrypi.org/downloads/raspbian/).

Não é uma boa prática, mas considerando que o usuário para este guia é **root**.

Seguem os passos para usar **cgminer** ou **bfgminer**.

## Otimizar Raspberry Pi

### Instalar screeen, tmux e byobu

    apt-get install byobu

Uso:

Selecionar '1' (modo screen):

    byobu-ctrl-a

Para conectar na sessão 'miner':

    byobu-screen -RD miner

CTRL+A+D para desconectar (a sessão continua rodando).

## Compilar c/bfgminer

### Instalar dependências

    apt-get install build-essential autoconf automake libtool pkg-config libcurl4-openssl-dev libudev-dev libncurses5-dev

Caso se utilize **bfgminer**, também é necessário instalar os seguintes pacotes:

    apt-get install uthash-dev libjansson-dev

### Obter código fonte do cgminer

    git clone https://github.com/ckolivas/cgminer.git
    cd cgminer

No caso do **bfgminer**:

    git clone https://github.com/luke-jr/bfgminer.git
    cd cgminer

### Compilar

Isto é necessário quando se clona do github

    ./autogen.sh

Esta configuração leva em consideração o processador do Raspberry Pi 3.

    CFLAGS="-O2 -Wall -mcpu=cortex-a53 -mfpu=neon-fp-armv8" ./configure
    make

### Arquivo de configuração

    vim ~/.cgminer/cgminer.conf

#### Exemplo de configuração

    {
        "disable-rejecting" : true,
        "failover-only" : true,
        "lowmem" : true,
        "net-delay" : true,
        "no-submit-stale" : true,
        "per-device-stats" : true,
        "verbose" : true,
        "widescreen" : true,
        "worktime" : true,
        "scrypt" : true,
        "pools" : [
            {
                "url" : "stratum+tcp://us.litecoinpool.org:3333",
                "user" : "desci.iikb",
                "pass" : "x"
            },
            {
                "url" : "stratum+tcp://us2.litecoinpool.org:3333",
                "user" : "desci.iikb",
                "pass" : "x"
            }
        ]
    }

## Instalar no sistema

    make install

### Systemd

#### Criar arquivo de serviço de sistema

    vim /lib/systemd/system/cgminer.service

##### Conteúdo do arquivo

    [Unit]
    Description=cgminer
    After=network.target nss-lookup.target
    
    [Service]
    Type=forking
    ExecStart=/usr/bin/screen -dmS miner /usr/local/bin/cgminer -c /root/.cgminer/cgminer.conf
    
    [Install]
    WantedBy=multi-user.target

#### Adicionar na inicialização

    systemctl enable cgminer.service

#### Iniciando

    systemctl start cgminer.service

### Crontab

    crontab -e

#### Adicionar linha

    @hourly /bin/bash /bin/systemctl is-active cgminer.service || /bin/systemctl start cgminer.service

---

# Experiências e casos reais

## Script de verificação dos arquivos

Normalmente [[eu|desci]] mudo o arquivo de configuração do cgminer frequentemente, ou porque tenho que alterar configuração de mineradoras, ou mais frequentemente, porque tenho que mudar a configuração de *pools*.

Nestas circunstâncias, [[eu|desci]] costumo ter vários arquivos de configuração, sendo que para não alterar os arquivos do sistema, faço um link simbólico para o arquivo de configuração e reinicio o serviço, por exemplo:

    rm /root/.cgminer/cgminer.conf; ln -s /root/.cgminer/litecoin.conf /root/.cgminer/cgminer.conf
    systemctl -l restart cgminer.service

Isto possibilita alterar a configuração do cgminer sem mexer em todo o sistema. No entanto, o tutorial acima não prevê este uso, e então é necessário alterar pelo menos uma vez o script do systemd para usar um script em bash (ou qualquer outra lingugagem) para alterar algumas coisas.

### Exemplo de script em bash

    mkdir /root/bin
    vim /root/bin/cgminer-start.bash

#### Conteúdo do arquivo

Disponível em <https://notabug.org/desci/scripts/src/master/raspian-miner.bash>

    #!/bin/bash
    ## Verifica arquivos de configuração antes de iniciar cgminer no raspberry pi
    
    ##
    ## Variáveis que podem ser alteradas
    ##
    MINER_BIN="cgminer"
    MINER_PATH="/usr/local/bin/${MINER_BIN}"
    CONFIG_DIR="/root/.${MINER_BIN}"
    CONFIG_FILE="${CONFIG_DIR}/${MINER_BIN}.conf"
    CONFIG_DEFAULT="${CONFIG_DIR}/default.conf"
    
    ##
    ## Provavelmente não tem nada pra mudar daqui pra frente
    ##
    CONFIG_FIND="$(find ${CONFIG_FILE} -type l -print0)"
    CONFIG_SUCH="$(/bin/echo -n ${CONFIG_FIND} | /bin/grep -e 'No such file or directory')"
    CONFIG_BROKEN="$(/bin/echo -n ${CONFIG_FIND} | xargs -r0 file | /bin/grep -e 'broken symbolic link')"
    
    ## Este teste é verdadeiro se o arquivo EXISTE
    if [ "${CONFIG_SUCH}" == "" ]
    then
    	## Este teste é verdadeiro se o link simbólico está quebrado
    	if [ "${CONFIG_BROKEN}" != "" ]
    	then
    		/bin/rm ${CONFIG_FILE}
    		/bin/ln -s "${CONFIG_DEFAULT}" "${CONFIG}"
    	fi
    	/usr/bin/screen -dmS "${MINER_BIN}" "${MINER_PATH}" -c "${CONFIG_FILE}"
    else
    	if [ -f "${CONFIG_DEFAULT}" ]
    	then
    		/bin/ln -s "${CONFIG_DEFAULT}" "${CONFIG}"
    	else
    		/bin/echo "Nenhum arquivo de configuração encontrado. Verifique a existência dos mesmos."
    		/bin/echo "O diretório ${CONFIG_DIR} deveria existir, com pelo menos o arquivo ${CONFIG_DEFAULT}."
    	fi
    fi

### Corrigir permissões do arquivo

    chmod ug+x /root/bin/cgminer-start.bash

### Alterar ExecStart do serviço do systemd

    ExecStart=/root/bin/cgminer-start.bash

### Recarregar o systemd

    systemctl daemon-reload

### Recarregar o serviço

    systemctl -l restart cgminer.service

---

## Gridseeds

Como [[eu|desci]] minero com ASICs Scrypt, então tenho as seguintes diferenças na hora de compilar o cgminer e na hora de configurar o mesmo:

### Compilar cgminer com suporte a gridseed e scrypt

#### Repositório alternativo

cgminer não tem mais suporte a scrypt, então eu uso o seguinte repositório: <https://githutb.com/dmaxl/cgminer>

#### Configuração do make

Antes de compilar o cgminer:

    CFLAGS="-O2 -Wall -mcpu=cortex-a53 -mfpu=neon-fp-armv8" ./configure --enable-gridseed --enable-scrypt

O bfgminer:

    CFLAGS="-O2 -Wall -mcpu=cortex-a53 -mfpu=neon-fp-armv8" ./configure --enable-gridseed --enable-scrypt --disable-all-drivers --disable-sha256d

#### Arquivo de configuração do c/bfgminer

Adicionar nas configurações em json:

        "scrypt" : true,
        "gridseed-options" : "freq=850,led_off=1",

### Minerar sem a conta root

#### Criar usuário com acesso a dispositivos

    # adduser miner
    # usermod -G plugdev -a miner

#### Adicionar mineradora nas regras udev

Criar arquivo `/etc/udev/rules.d/10-gridseed.rules` com o seguinte conteúdo:

    ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", SUBSYSTEMS=="usb", ACTION=="add", MODE="0666", GROUP="plugdev"

#### Alterar serviço systemd

Adicionar na seção `[Service]`:

    User=miner

#### Recarregar systemd

    # systemctl daemon-reload
    # systemctl restart cgminer.service

[[!tag raspberry "raspberry pi" mineração cgminer bitcoin tutorial]]
[[!meta title="Minerar criptomoeda com raspberry pi"]]
